https://leetcode.cn/problems/minimum-genetic-mutation/description/
//class Solution {
//public:
//    int minMutation(string startGene, string endGene, vector<string>& bank) {
//        unordered_set<string> vis;
//        unordered_set<string> hash(bank.begin(), bank.end());
//        string change = "ACGT";
//
//        if (startGene == endGene) {
//            return 0;
//        }
//        if (!hash.count(endGene)) {
//            return -1;
//        }
//        queue<string> q;
//        q.push(startGene);
//        vis.insert(startGene);
//
//        int sum = 0;
//        while (q.size()) {
//            sum++;
//            int sz = q.size();
//            while (sz--) {
//                string s = q.front();
//                q.pop();
//                for (int i = 0; i < 8; i++) {
//                    string tmp = s;
//                    for (int j = 0; j < 4; j++) {
//                        tmp[i] = change[j];
//                        if (hash.count(tmp) && !vis.count(tmp)) {
//                            if (tmp == endGene) {
//                                return sum;
//                            }
//                            q.push(tmp);
//                            vis.insert(tmp);
//                        }
//                    }
//                }
//            }
//        }
//        return -1;
//    }
//};

https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/description/
//class Solution {
//public:
//    int dx[4] = { 1,-1,0,0 };
//    int dy[4] = { 0,0,-1,1 };
//    bool vis[101][101];
//
//    int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {
//
//        int m = maze.size(), n = maze[0].size();
//        queue<pair<int, int>> q;
//        q.push({ entrance[0],entrance[1] });
//        vis[entrance[0]][entrance[1]] = true;
//
//        int sum = 0;
//
//        while (q.size()) {
//            sum++;
//            int sz = q.size();
//            for (int i = 0; i < sz; i++) {
//                auto [a, b] = q.front();
//                q.pop();
//                for (int k = 0; k < 4; k++) {
//                    int x = a + dx[k];
//                    int y = b + dy[k];
//                    if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && maze[x][y] == '.') {
//                        if (x == 0 || x == m - 1 || y == 0 || y == n - 1) {
//                            return sum;
//                        }
//                        q.push({ x,y });
//                        vis[x][y] = true;
//                    }
//                }
//            }
//        }
//        return -1;
//    }
//};